home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TPUG - Toronto PET Users Group
/
TPUG Users Group CD
/
TPUG Users Group CD.iso
/
COMAL
/
Z-Misc Series
/
(k)zd.d64
/
src.calc
< prev
next >
Wrap
Text File
|
2007-03-01
|
3KB
|
150 lines
;
;--------------------------------;
;CALC - A COMAL MODULE ;
; EXTENDING COMAL-80 WITH ;
; FUNC HEX$(N), 0<=N<=255 ;
; ;
;BY DICK KLINGENS ;
;DUTCH COMAL80 USERS GROUP ;
;OKT 1985 ;
;--------------------------------;
;
* = $BF00
;--------------------- CONSTANTS
;
FUNC = 227
ENDFNC = 126
INT = 1
STR = 2
VALUE = 114
DEFPAG = %01000110
;--------------------- ROUTINES
;
FNDPAR = $C896
RUNERR = $C9FB
DUMMY = $CA2F
;--------------------- VARIABLES
;
COPY1 = $0045
ANT = $0055
STOS = $002D
SFREE = $002F
;--------------------- MODULE
;
.BYTE DEFPAG
.WORD LEIND
.WORD DUMMY
.BYTE 7,'CALCHEX'
.WORD PROCT
.WORD DUMMY
.BYTE 0
;
PROCT .BYTE 3,'HEX'
.WORD HHEX
.BYTE 0
;
HHEX .BYTE FUNC+STR,<MAIN,>MAIN,1
.BYTE VALUE+INT
.BYTE ENDFNC
;--------------------- PROCEDURE BODY
;
; ; PROC MAIN
MAIN LDA #2 ; ANT:=2 //LENGTH
STA ANT
LDA #0
STA ANT+1
JSR TEST ; EXEC TEST
JSR CNVRT ; EXEC CNVRT
JSR STROK ; EXEC STROK
RTS ;ENDPROC MAIN
;
; TEST IF THERE ROOM ON COMAL STACK
;
; ; PROC TEST
TEST CLC ; CARRY:=0
LDA ANT ; .A:=LO ANT
ADC STOS ; .A:+STOS
TAX ; .X:=LO ANT+STOS
LDA ANT+1 ; .A:=HI ANT
ADC STOS+1 ; .A:=HI STOS
BCS STERR ; IF CARRY THEN GOTO STERR
TAY ; .Y:=.A
TXA ; .A:=.X //NOW .A=LO ANT+STOS
ADC #<2 ; .A:+2 //LENGTH
TAX ; .X:=.A
TYA
ADC #>2
BCS STERR ; IF CARRY THEN GOTO STERR
CPX SFREE ; IF ANT+STOS>SFREE THEN
SBC SFREE+1
BCS STERR ; GOTO STERR
RTS ;ENDPROC TEST
;
STERR LDX #56
JMP RUNERR
;
; CONVERT TO HEX$
;
; ; PROC CNVRT
CNVRT LDA #1 ; .A:=1 //FIRST PARAM
JSR FNDPAR ; COPY1:=ADDRESS
LDY #0
LDA (COPY1),Y ; .A:=COPY1
BNE ARGERR ; IF .A<>0 THEN GOTO ARGERR
INY ; .Y:+1
LDA (COPY1),Y ; .A:=(COPY1+Y)
JSR TOHEX ; EXEC TOHEX
RTS ;ENDPROC CNVRT
;
ARGERR LDX #1
JMP RUNERR
;
; ; PROC TOHEX
TOHEX PHA ; STACK:=.A
LSR A ; LOGICAL SHIFT RIGHT
LSR A
LSR A
LSR A
JSR HEX ; EXEC HEX
PLA ; .A:=STACK
AND #15 ; .A:=.A BITAND 15
JSR HEX ; EXEC HEX
RTS ;ENDPROC HEX
;
; ; PROC HEX
HEX CMP #10 ; IF .A<10 THEN
BCC OFSET ; GOTO OFSET
CLC ; CARRY:=0
ADC #7 ; .A:+7
;
OFSET ADC #'0 ; .A:+ORD("0")
; ; //CHAR TO STACK
LDY #0 ; .Y:=0
STA (STOS),Y ; .A:=(STOS+Y)
INC STOS ; STOS:+1
BNE OK ; IF STOS<>0 THEN GOTO OK
INC STOS+1 ; ELSE (STOS+1):+1
;
OK RTS ;ENDPROC HEX
;
; LENGTH ON STACK AND
; CHANGE OF STACK POINTER
;
; ; PROC STROK
STROK LDY #0 ; .Y:=0
LDA ANT+1
STA (STOS),Y ; (STOS+Y):=.A
INY ; .Y:+1
LDA ANT ; .A:=LO ANT
STA (STOS),Y ; (STOS+Y):=.A
CLC ; CARRY:=0
LDA STOS ; .A:=LO STOS
ADC #<2
STA STOS ; STOS:=.A
LDA STOS+1 ; .A:=HI STOS
ADC #>2 ; .A:+0
STA STOS+1 ; (STOS+1):=.A
RTS ;ENDPROC STROK
;
LEIND .END ;// END MODULE